﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace _20161208_ArraysPractice
{
    class Program
    {
        static void Main(string[] args)
        {
            //DoTask1();
            //DoTask2();
            DoTask3();
            //DoTask4();
            //DoTask5();
        }

        //Создать двумерный массив - размеры массива выбирает пользователь из консоли.
        //Заполнить массив случайными числами в диапазоне от 1 до 20.
        //Вывести полученный массив на экран.
        //Посчитать количество четных и нечетных элементов в массиве
        static void DoTask1()
        {
            SetSizeCreateArray();

            int[,] array = SetSizeCreateArray(1, 20);
            int evenNumberCount = 0;
            PrintArray(array);
            for (int i = 0; i < array.GetLength(0); i++)
                for (int j = 0; j < array.GetLength(1); j++)
                    if (array[i, j] % 2 == 0)
                        evenNumberCount++;
            Console.WriteLine("Число четных элементов: {0}", evenNumberCount);
            Console.WriteLine("Число нечетных элементов: {0}", array.Length - evenNumberCount);
        }

        //Создается массив из n строк и m столбцов.
        //Найти: максимальный из наименьших элементов столбцов.
        static void DoTask2()
        {
            int[,] array = SetSizeCreateArray();
            PrintArray(array);
            int maxMin = Int32.MinValue;

            Console.WriteLine();
            Console.WriteLine("Минимумы по столбцам:");
            for (int i = 0; i < array.GetLength(1); i++)
            {
                int currentMin = Int32.MaxValue;
                for (int j = 0; j < array.GetLength(0); j++)
                {
                    if (array[j,i] < currentMin)
                    {
                        currentMin = array[j, i];
                    }
                }
                Console.Write("{0} \t", currentMin);
                if (currentMin > maxMin)
                {
                    maxMin = currentMin;
                }
            }
            Console.WriteLine();
            Console.WriteLine("Максимальный из минимумов: {0}", maxMin);
        }

        //Создать двумерный массив, заполненный случайными числами.
        //После заполнения — показать заполненный массив на экран 
        //посчитать сумму элементов отдельно в каждом столбце и каждой строке.
        static void DoTask3()
        {   
            int[,] array = SetSizeCreateArray();
            int[] sumRowElements = GetArrayWithSumOfEashRowOf2DimensionalArray(array);
            int[] sumColumnElements = GetArrayWithSumOfEashColumnOf2DimensionalArray(array);
 
            Console.Clear();
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                    Console.Write("{0} \t", array[i, j]);
                Console.Write("\t{0}", sumRowElements[i]);
                Console.WriteLine();
            }

            Console.WriteLine();
            PrintArray(sumColumnElements);
        }

        //Заполнить двумерный массив случайными числами от 10 до 100. 
        //Посчитать сумму элементов отдельно в каждой строке и определить номер строки, в которой эта сумма максимальна.
        static void DoTask4()
        {
            int[,] array = SetSizeCreateArray(10, 100);
            int[] sumRowArray = GetArrayWithSumOfEashRowOf2DimensionalArray(array);
            Console.WriteLine("Массив");
            PrintArray(array);
            Console.WriteLine("Сумма элементов построчно:");
            PrintArray(sumRowArray);
            Console.WriteLine("Максимальная сумма в {0} строке.", Array.IndexOf(sumRowArray,sumRowArray.Max()) + 1);
        }

        //Создать двумерный массив, заполненный случайными числами.
        //Найти произведение ненулевых элементов массива.
        static void DoTask5()
        {
            int[,] array = SetSizeCreateArray(0, 10);
            long multiplyValue = 1;
            for (int i = 0; i < array.GetLength(0); i++)
                for (int j = 0; j < array.GetLength(1); j++)
                    if (array[i, j] != 0)
                        multiplyValue *= array[i, j];
            Console.Clear();
            Console.WriteLine("Массив:");
            PrintArray(array);
            Console.WriteLine("Сумма произведений ненулевых элементов: {0}", multiplyValue);    
        }

       //Получает двумерный массив
       //Возвращает одномерный массив, который содержит сумму элементов каждой строки
       static int[] GetArrayWithSumOfEashRowOf2DimensionalArray(int[,] initialArray)
        {
            int[] sumRowElements = new int[initialArray.GetLength(0)];
            for (int i = 0; i < initialArray.GetLength(0); i++)
            {
                int rowSum = 0;
                for (int j = 0; j < initialArray.GetLength(1); j++)
                {
                    rowSum += initialArray[i, j];
                }
                sumRowElements[i] = rowSum;
            }
            return sumRowElements;
        }

        //Получает двумерный массив
        //Возвращает одномерный массив, который содержит сумму элементов каждого столбца
        static int[] GetArrayWithSumOfEashColumnOf2DimensionalArray(int[,] initialArray)
        {
            int[] sumColumnElements = new int[initialArray.GetLength(1)];
            for (int i = 0; i < initialArray.GetLength(1); i++)
            {
                int columnSum = 0;
                for (int j = 0; j < initialArray.GetLength(0); j++)
                {
                    columnSum += initialArray[j, i];
                }
                sumColumnElements[i] = columnSum;
            }
            return sumColumnElements;
        }

        //распечатывает двумерный массив
        static void PrintArray(int[,] array)
        {
            for (int i = 0; i < array.GetLength(0); i++)
            {
                for (int j = 0; j < array.GetLength(1); j++)
                    Console.Write("{0} \t", array[i, j]);
                Console.WriteLine();
            }
        }

        //печать одномерного массива
        static void PrintArray(int[] array)
        {
            for (int i = 0; i < array.GetLength(0); i++)
            {
                    Console.Write("{0} \t", array[i]);
            }
            Console.WriteLine();
        }

        //Запрашивает размеры массива и возвращает сгенерированный 
        static int[,] SetSizeCreateArray(int minValue = 0, int maxValue = 10)
        {
            Console.WriteLine("Введите длину массива");
            int rows = Int32.Parse(Console.ReadLine());
            Console.WriteLine("Введите ширину массива");
            int columns = Int32.Parse(Console.ReadLine());

            return CreateFillArray(rows, columns, minValue, maxValue);
        }

        //создает двумерный массив и заполняет его
        static int[,] CreateFillArray(int rowCount, int columnCount, int minValue = 0, int maxValue = 10)
        {
            int[,] array = new int[rowCount, columnCount];
            Random rand = new Random();
            for (int i = 0; i < rowCount; i++)
                for (int j = 0; j < columnCount; j++)
                    array[i, j] = rand.Next(minValue, maxValue + 1);
            return array;
        }
    }
}
